package com.xy.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import com.xy.Cache.PublicParamsCache;
import com.xy.pojo.TPublicParams;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * 获取到需要传递的参数是那些 ，然后在获取到用户传递的参数是什么 进行比较
 * @Author: xiaoyang
 * @Date: 2022/11/20/19:21
 * @Description:
 */
@Component
public class PublicParamFilter extends ZuulFilter {

    //假如把参数放在一个数组里写死，如果参数发生变化，就得修改代码，不合适，这个参数应该是动态的，可以放到redis中

    private PublicParamsCache publicParamsCache;

    @Autowired
    public void setPublicParamsCache(PublicParamsCache publicParamsCache) {
        this.publicParamsCache = publicParamsCache;
    }

    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    @Override
    public int filterOrder() {
        return FilterConstants.PRE_DECORATION_FILTER_ORDER+1;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() throws ZuulException {

        //假如我们的参数保存在redis中 在这里我们只需要在redis获取就可以 拿到所有参数的名字 那么说明这个值在redis中应该是set保存
        //只需要远程调用redis从set中获取就行
        //遍历所有的参数，以她的名字在请求中获取值，获取到了代表传递了
        //没有获取到 拦截请求 返回数据
        // TODO: 2022/11/20 公共参数不是经常的变化的 没必要每次都查询redis 所以需要添加本地缓存

        List<TPublicParams> publicParams = publicParamsCache.getPublicParams(); //存放的是所以必须传递的参数
        RequestContext currentContext = RequestContext.getCurrentContext();
        HttpServletRequest httpServletRequest = currentContext.getRequest();

        publicParams.forEach(tPublicParams -> {
            String paramName = tPublicParams.getParamName();//获取参数名
            Short isMust = tPublicParams.getIsMust();//是否必须传递
            Short enableState = tPublicParams.getEnableState();//是不是启用

            if (1 == isMust && 1 == enableState) {
                String parameter = httpServletRequest.getParameter(paramName);
                if (!StringUtils.hasText(parameter)) {
                    //参数没有传递 需要拦截
                    currentContext.setSendZuulResponse(false);
                    currentContext.addZuulResponseHeader("context-Type","text/html;charset=utf-8");
                    currentContext.setResponseBody("参数没有传递");
                }
            }

        });


        return null;
    }
}
